/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Congresos;

import persona.Revisor;
import persona.Presidente;
import persona.Ponente;
import java.util.ArrayList;
import java.io.Serializable;
import java.util.GregorianCalendar;
import java.util.Enumeration;
import java.util.Iterator;
import congresos.ICongreso;

/**
 *
 * @author alejandro.suarez3
 */
public class Congreso implements ICongreso,Serializable {

    private String nombre;
    private String cif;
    private Presidente presidente;
    private ArrayList<Ponente> ponentes;
    private ArrayList<Revisor> revisores;
    private ArrayList<Trabajo> trabajosCon;
    private GregorianCalendar fechaFinalPonente;
    private GregorianCalendar fechaFinalRevisor;

    public Congreso(String nombre, String cif) {
        setNombre(nombre);
        setCif(cif);
        ponentes = new ArrayList<Ponente>();
        revisores = new ArrayList<Revisor>();
        trabajosCon = new ArrayList<Trabajo>();
        presidente = null;
        fechaFinalPonente = new GregorianCalendar();
        fechaFinalRevisor = new GregorianCalendar();
    }

    public Congreso(String nombre, String cif, Presidente presidente) {
        setNombre(nombre);
        setCif(cif);
        setPresidente(presidente);
        ponentes = new ArrayList<Ponente>();
        revisores = new ArrayList<Revisor>();
        trabajosCon = new ArrayList<Trabajo>();
        fechaFinalPonente = new GregorianCalendar();
        fechaFinalRevisor = new GregorianCalendar();
    }

    public GregorianCalendar getFechaFinalPonente() {
        return fechaFinalPonente;
    }

    public void setFechaFinalPonente(GregorianCalendar fechaFinalPonente) {
        this.fechaFinalPonente = fechaFinalPonente;
    }

    public GregorianCalendar getFechaFinalRevisor() {
        return fechaFinalRevisor;
    }

    public void setFechaFinalRevisor(GregorianCalendar fechaFinalRevisor) {
        this.fechaFinalRevisor = fechaFinalRevisor;
    }

    public String getCif() {
        return cif;
    }

    public void setCif(String cif) {
        this.cif = cif;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Presidente getPresidente() {
        return presidente;
    }

    public void setPresidente(Presidente presidente) {
        this.presidente = presidente;
        this.presidente.setCongreso(this);
    }

    public ArrayList<Revisor> getRevisores() {
        return (ArrayList<Revisor>) revisores.clone();
    }

    public void setRevisores(ArrayList<Revisor> revisores) {
        this.revisores = revisores;
    }

    public ArrayList<Trabajo> getTrabajosCon() {
        return (ArrayList<Trabajo>) trabajosCon.clone();
    }

    public ArrayList<Ponente> getPonentes() {
        return (ArrayList<Ponente>) ponentes.clone();
    }

    public void darAltaPonente(Ponente ponente) {
        int chequeo = 0;
        GregorianCalendar fecha = new GregorianCalendar();
        if (getFechaFinalPonente().after(fecha)) {
            for (int i = 0; i < ponentes.size(); i++) {
                if (ponentes.get(i).getDni().equals(ponente.getDni())) {
                    chequeo = 1;
                    break;
                }

            }
            if (chequeo == 0) {
                ponente.setCongreso(this);
                ponentes.add(ponente);
            }
            else
            {
                System.out.println("El ponente ya existe");
            }
                
        } else {
            System.out.println("La fecha para dar de alta un ponente a finalizado");
        }
    }
    
    
    public void darAltaPonente(String nombre, String dni, String pasword,String afiliacion,String direccion,String correoElectronico) {

        Ponente ponente = new Ponente(nombre, dni, pasword,afiliacion,direccion,correoElectronico);
        darAltaPonente(ponente);


    }
      public void darAltaRevisor(Revisor revisor) {
        int chequeo = 0;
        GregorianCalendar fecha = new GregorianCalendar();
        if (getFechaFinalPonente().after(fecha)) {  //Chequeamos que la fecha limite de alta sea la misma que en el ponente
            for (int i = 0; i < revisores.size(); i++) {
                if (revisores.get(i).getDni().equals(revisor.getDni())) {
                    chequeo = 1;
                    break;
                }

            }
            if (chequeo == 0) {   //MIRarlo bien deberiamos hacerlo en el main
                revisor.setCongreso(this);
                revisores.add(revisor);    
            }
            else
            {
                System.out.println("El revisor ya existe");
            }
                
        } else {
            System.out.println("La fecha para dar de alta un revisor a finalizado");
        }
    }


    public void modificarContenidoTrabajo(String titulo, String fichero) {
        for (int i = 0; i < trabajosCon.size(); i++) {
            if (trabajosCon.get(i).getTitulo().equals(titulo)) {
                trabajosCon.get(i).setFichero(fichero);
            }
        }
    }

    public int modificarContenidoTrabajo(Trabajo trabajo, String titulo) {

        for (int i = 0; i < trabajosCon.size(); i++) {
            if (trabajosCon.get(i).getTitulo().equals(titulo)) {
                if (trabajo.getTitulo().equals(titulo)) {
                    trabajosCon.get(i).setSubTematicas();           //Borramos el array de subtematicas
                    trabajosCon.get(i).setResumen(trabajo.getResumen());
                    trabajosCon.get(i).setTematica(trabajo.getTematica());
                    trabajosCon.get(i).setSubTematicas(trabajo.getSubTematicas());
                    trabajosCon.get(i).setUsuarios(trabajo.getUsuarios());
                    return 0;
                } else {
                    for (int j = 0; j < trabajosCon.size(); j++) {
                        if (trabajosCon.get(j).getTitulo().equals(trabajo.getTitulo())) {
                            System.out.println("El titulo que quiere modificar conincide con el de otro trabajo");
                            return 1;
                        }
                    }
                    trabajosCon.get(i).setSubTematicas();
                    trabajosCon.get(i).setResumen(trabajo.getResumen());
                    trabajosCon.get(i).setTematica(trabajo.getTematica());
                    trabajosCon.get(i).setTitulo(trabajo.getTitulo());
                    trabajosCon.get(i).setSubTematicas(trabajo.getSubTematicas());
                    trabajosCon.get(i).setUsuarios(trabajo.getUsuarios());
                    return 0;
                }
            }
        }
        System.out.println("El titulo es incorrecto");
        return 1;
    }

    public int darAltaTrabajo(Trabajo trabajo) {

        for (int i = 0; i < trabajosCon.size(); i++) {            //Chequeamos que no exista ningun trabajo con el mismo titulo aunque sean de distintos ponentes
            if (trabajosCon.get(i).getTitulo().equals(trabajo.getTitulo())) {
                System.out.println("Ya existe un trabajo con ese titulo");
                return 1;
            }
        }
        if (trabajo.getResumen() != null && trabajo.getTematica() != null && trabajo.getFichero() != null && trabajo.getSubTematicas().isEmpty() == false && trabajo.getUsuarios() != null) {
            trabajosCon.add(trabajo);
            return 0;
        } else {
            System.out.println("Al trabajo le falta algun parametro");
            return 1;
        }


    }

    public void darBajaTrabajo(Trabajo trabajo) {
        for (int i = 0; i < trabajosCon.size(); i++) {
            if (trabajosCon.get(i).getTitulo().equals(trabajo.getTitulo())) {
                trabajosCon.remove(i);
                break;
            }

        }
    }
    
    public String obtenerNombreRevisor(String dni) {
        for (int i = 0; i < getRevisores().size(); i++) {
            if (getRevisores().get(i).getDni().equals(dni)) {
                return getRevisores().get(i).getNombre();
            }
        }
        return "False";
    }
    
    public ArrayList<Trabajo> ObtenerTrabajosSinNota() {

        ArrayList<Trabajo> trabajosSinNota = new ArrayList<Trabajo>();

        for (int i = 0; i < trabajosCon.size(); i++) {

            if (trabajosCon.get(i).getNotas().size() < 3) {
                trabajosSinNota.add(trabajosCon.get(i));

            }

        }
        return trabajosSinNota;
    }
 public void imprimirTrabajos(Trabajo trabajo) {

        System.out.println("El titulo del trabajo es " + trabajo.getTitulo());
        System.out.println("El resumen del trabajo es " + trabajo.getResumen());
        System.out.println("El fichero del trabajo es " + trabajo.getFichero());
        System.out.println("Los revisores del trabajo son: ");
        
        Iterator fechas = trabajo.getFechas().values().iterator();

        ArrayList<String> dnis = new ArrayList<String>();
        Enumeration clave = trabajo.getFechas().keys();
        while (clave.hasMoreElements()) {
            dnis.add((String) clave.nextElement());
        }
        
        int indice=0;
        while (fechas.hasNext()) {   
           GregorianCalendar fecha= (GregorianCalendar) fechas.next();
           System.out.println("El revisor " + obtenerNombreRevisor(dnis.get(indice)) + " deberá asignar una nota al trabajo " + trabajo.getTitulo() + " antes del " + fecha.get(GregorianCalendar.DATE) + "/" + (fecha.get(GregorianCalendar.MONTH)+1) + "/"+ fecha.get(GregorianCalendar.YEAR));
           indice++;
        }
      
        System.out.println("El ponente del trabajo es " + trabajo.getPonente().getNombre());
        System.out.println("Los autores del trabajo son: ");
        for (int j = 0; j < trabajo.getUsuarios().size(); j++) {
            System.out.println(trabajo.getUsuarios().get(j).getNombre());
        }

        System.out.println("La tematica del trabajo es " + trabajo.getTematica());
        System.out.println("Las subtematicas son:");
        for (int j = 0; j < trabajo.getSubTematicas().size(); j++) {
            System.out.println(trabajo.getSubTematicas().get(j));
        }
        Iterator calificaciones = trabajo.getNotas().values().iterator();

        ArrayList<String> totalClaves = new ArrayList<String>();
        Enumeration claves = trabajo.getNotas().keys();
        while (claves.hasMoreElements()) {
            totalClaves.add((String) claves.nextElement());
        }

        int contador = 0;
        
        while (calificaciones.hasNext()) {
            System.out.println("La calificacion del revisor " + obtenerNombreRevisor(totalClaves.get(contador)) + " para el trabajo " + trabajo.getTitulo() + " es: " + calificaciones.next());
            contador++;

        }
        if (contador==0){
             System.out.println("Este trabajo no contiene calificaciones ");
        }
        System.out.println();
        System.out.println();
    }
 
}
